//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//#include "Commons.h"
//#include "IAnimatedObject.h"
//#include "CGlobals.h"
//#include "FpsColladaDatabase.h"
//#include "os.h"
////#include "CColladaEventsManager.h"
////#include "ITimeController.h"
//#include "ISceneManager.h"
//#include "ISceneNode.h"
////#include "CColladaSceneNodeAnimator.h"
//
//#include <cmath>
//
//using namespace irr;
//using namespace scene;
//
////void DummyEventsHandler(const collada::STriggeredEvent &event, void *userData)
////{
////
////}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//IAnimatedObject::IAnimatedObject() :
//	m_timelineController(0),
//	m_SceneNode(0),
//	m_animatorNode(0),
//	m_eventsManager(0),
//	m_isCrtAnimFinished(false)
//{
//	m_curAnim.m_ID = -1;
//	m_curAnim.m_loop = false;
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//IAnimatedObject::~IAnimatedObject()
//{
//	if(m_timelineController)
//	{
//		m_timelineController->drop();
//	}
//
//	if(m_SceneNode)
//	{
//		m_SceneNode->drop();
//	}
//
//	if(m_animatorNode)
//	{
//		m_animatorNode->drop();
//	}
//
//	if (m_eventsManager)
//	{
//		m_eventsManager->drop();
//	}
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//void IAnimatedObject::SetMeshAndAnimator()
//{
//	GX_ASSERT(m_SceneNode);
//
//	if (m_timelineController)
//	{
//		m_timelineController->drop();
//		m_timelineController = NULL;
//	}
//
//	if (!m_animatorNode)
//	{
//		list<ISceneNodeAnimator*> _animators = m_SceneNode->getAnimators();
//		if (_animators.getSize() > 0)
//		{
//			list<ISceneNodeAnimator*>::Iterator it = _animators.begin();
//			m_animatorNode = static_cast<irr::collada::CSceneNodeAnimator*>(*it);
//			m_animatorNode->grab();
//			m_SceneNode->removeAnimators();
//		}
//	}
//	
//	if (!m_animatorNode)
//	{
//		return;
//	}
//
//	if (m_SceneNode->getType() != scene::ESNT_COLLADA_ROOT) return;
//
//	m_animatorNode->onBind(m_SceneNode);
//	
//
//	m_timelineController = m_animatorNode->getTimelineCtrl();
//	m_timelineController->grab();
//	m_animatorNode->setTimelineCtrl(0);
//	
//	m_eventsManager = m_animatorNode->getEventsManager();	
//	if (m_eventsManager)
//	{
//		m_eventsManager->setCallback(DummyEventsHandler , 0 );
//		m_eventsManager->grab();
//	}
//	m_animatorNode->setEventsManager(0);
//
//	m_lastTime = g->device->getTimer()->getRealTime();
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//void IAnimatedObject::SetMeshAndAnimator(irr::scene::ISceneNode* meshNode, irr::collada::CSceneNodeAnimator *animatorNode)
//{
//	GX_ASSERT(meshNode);
//
//	m_SceneNode		=	meshNode;
//	m_animatorNode	=	animatorNode;
//
//	if(m_SceneNode)
//	{
//		ISceneNode* bbox = m_SceneNode->getSceneNodeFromName("bbox");
//		if(bbox)
//			bbox->setVisible(false);
//	}
//
//	SetMeshAndAnimator();
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//void IAnimatedObject::LoadMeshAndAnimator(const char* meshFilename, const char* animatorFilename)
//{
//	m_SceneNode	= ConstructColladaScene(meshFilename);
//
//	GX_ASSERT(m_SceneNode);
//
//	if(animatorFilename)
//	{
//		m_animatorNode	= ConstructColladaAnimator(animatorFilename);
//	}
//	else
//	{
//		m_animatorNode = 0;
//	}
//
//	SetMeshAndAnimator();
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//void IAnimatedObject::RestartCurrentAnim()
//{
//	m_curAnim.m_time	=	0;
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//bool IAnimatedObject::HasAnim()
//{
//	return m_timelineController && (m_timelineController->getClipCount() != 0);
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//void IAnimatedObject::SetAnim(int newAnim, bool loop)
//{
//	if (newAnim >= 0)
//	{
//		GX_ASSERT(m_timelineController);
//	}
//
//	if (m_curAnim.m_ID != newAnim)
//	{
//		m_curAnim.m_ID			=	newAnim;
//		if (m_curAnim.m_ID >= 0)
//		{
//			m_curAnim.m_start		=	m_timelineController->getClipStart(newAnim);
//			m_curAnim.m_end			=	m_timelineController->getClipEnd(newAnim);
//			m_curAnim.m_length		=	m_timelineController->getClipLength(newAnim);
//			m_curAnim.m_speed		=	1.0f;
//			m_curAnim.m_back		=	false;
//		}
//	}
//	m_curAnim.m_loop		=	loop;
//	m_curAnim.m_time		=	0;
//	m_isCrtAnimFinished = false;
//	m_lastTime = g->device->getTimer()->getRealTime();
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//void IAnimatedObject::SetAnimWithSpeed(int newAnim, float speed, bool loop)
//{
//	SetAnim(newAnim, loop);
//
//	m_curAnim.m_back	=	(speed < 0.f);
//	m_curAnim.m_speed	=	std::abs(speed);
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//bool IAnimatedObject::IsGoingToLoop(int ms)
//{
//	if (m_curAnim.m_ID == -1)
//	{
//		return false;
//	}
//
//	//if (m_curAnim.m_time > ((m_curAnim.m_time + ms) % m_curAnimm.m_length))
//	if ((m_curAnim.m_time + ms) >= m_curAnim.m_length)
//	{
//		return true;
//	}
//
//	return false;
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//void IAnimatedObject::UpdateAnim(int fixedDT)
//{
//	if(!m_animatorNode)
//		return;
//	if (!m_SceneNode->isVisible())
//		return;
//
//	int curTime = g->device->getTimer()->getRealTime();	
//
//	if(m_curAnim.m_ID != -1)
//	{
//		int dt = curTime - m_lastTime;		
//
//		if(fixedDT>=0)
//			dt = fixedDT;
//
//		int ms = dt * m_curAnim.m_speed;
//		 
//		bool loop = IsGoingToLoop(ms);
//
//		m_curAnim.m_time += ms;
//
//		if(loop)
//		{
//			if(!m_curAnim.m_loop)
//			{
//				m_curAnim.m_time = m_curAnim.m_length - 1;
//			}
//			else if (m_curAnim.m_length != 0)
//			{
//				m_curAnim.m_time %= m_curAnim.m_length;
//			}
//			else
//			{
//				m_curAnim.m_time = -1;	
//			}
//		}
//
//		u32 timeMs = 0;
//		if(!m_curAnim.m_back)
//		{
//			timeMs = m_curAnim.m_start + m_curAnim.m_time;				
//		}
//		else
//		{
//			timeMs =  m_curAnim.m_end - m_curAnim.m_time;
//		}
//		
//		m_animatorNode->animateNode(m_SceneNode, timeMs);
//
//		if (m_eventsManager)
//		{				
//				m_eventsManager->onUpdate( 0 , timeMs , m_curAnim.m_start, m_curAnim.m_end);
//		}
//
//		if (loop)
//		{
//			m_isCrtAnimFinished = true;
//			SwitchAnim();
//		}
//	}
//
//	m_lastTime = curTime;
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//void IAnimatedObject::SwitchAnim()
//{
//}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
